package net.cyue.easyconfiguration.node;

import java.util.List;
import java.util.Map;
import java.util.Set;

public enum NodeType {
    ANY,
    STRING,
    NUMBER,
    BOOLEAN,
    ARRAY,
    TABLE;

    public static NodeType fromString(String type) {
        for (NodeType t : values()) {
            if (t.name().equalsIgnoreCase(type)) {
                return t;
            }
        }
        return ANY;
    }
    public static NodeType fromClass(Class<?> clazz) {
        if (
            String.class.isAssignableFrom(clazz) ||
            Character.class.isAssignableFrom(clazz) ||
            clazz == char.class ||
            StringBuffer.class.isAssignableFrom(clazz) ||
            StringBuilder.class.isAssignableFrom(clazz)
        ) {
            return STRING;
        } else if (
            byte.class.isAssignableFrom(clazz) ||
            short.class.isAssignableFrom(clazz) ||
            int.class.isAssignableFrom(clazz) ||
            long.class.isAssignableFrom(clazz) ||
            float.class.isAssignableFrom(clazz) ||
            double.class.isAssignableFrom(clazz) ||
            Number.class.isAssignableFrom(clazz) ||
            Byte.class.isAssignableFrom(clazz) ||
            Short.class.isAssignableFrom(clazz) ||
            Integer.class.isAssignableFrom(clazz) ||
            Long.class.isAssignableFrom(clazz) ||
            Float.class.isAssignableFrom(clazz) ||
            Double.class.isAssignableFrom(clazz)
        ) {
            return NUMBER;
        } else if (
            boolean.class.isAssignableFrom(clazz) ||
            Boolean.class.isAssignableFrom(clazz)
        ) {
            return BOOLEAN;
        } else if (
            clazz.isArray() ||
            Set.class.isAssignableFrom(clazz) ||
            List.class.isAssignableFrom(clazz)
        ) {
            return ARRAY;
        } else if (Map.class.isAssignableFrom(clazz)) {
            return TABLE;
        }
        return ANY;
    }
}
